perm filename NEIGHB.SAI[PIC,HE] blob sn#430335 filedate 1979-04-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	entry neighb,neifnd
C00007 ENDMK
C⊗;
entry neighb,neifnd;
begin "neighb"
require "vislib.dcl" source!file;
require "⊂⊃<>" delimiters;
define notiming=⊂TRUE⊃;
source!l(saitim);
source!v(extitm);
source!V(murky.dcl);

internal procedure neifnd(integer ii,jj,ibuf,obuf; integer value;safe integer array neiarr);
	begintim(neifndfollow,
	<safe integer array neighbors[0:7];
	integer k,l,m,n,initi,initj,p,oldval,rws,cols,ro,co,i,j,st,temp,tmp1,iind,jind,numpt,offi,offj;>)

	rws←rows(ibuf);  cols←colms(ibuf);
	ro←rows(obuf);  co←colms(obuf);
	i←initi←ii;  j←initj←jj;
	offi←isubst(ibuf)-isubst(obuf);
	offj←jsubst(ibuf)-jsubst(obuf);
	st←0;

	numpt←0;
	IF (DUM←BDRPRE(N,I,J,IBUF,RWS,COLS,NEIGHBORS))≤0 THEN BLRETURN;
	while true do
		begin "loop"
		temp←(n+st) mod 8;
		i←i+icasev(temp);
		j←j+jcasev(temp);
		for m←0 thru 7 do
			begin "ckloop"
			tmp1←(m+st) mod 8;
			iind←offi+i+icasev(tmp1);
			jind←offj+j+jcasev(tmp1);
			if 1≤iind≤ro ∧ 1≤jind≤co then
				if 0 < (k←getpnt(iind,jind,obuf)) < value
					then neiarr[k]←-1;
			end;
		putpnt(i+offi,j+offj,value,obuf);
		if i=initi ∧ j=initj then done "loop";
		bdrpost(n,st,temp,i,j,ibuf,rws,cols,neighbors);
		end "loop";

	endtim(neifndfollow);

internal procedure neighb(list regs1; string file; integer bigmsk);
    begintim(neighb,
    <string dev,masks;
    string itemvar maskn,reg;
    integer rowlim,collim,byts,picbuf,regbuf,flag,regmax,ii,jj,i,mr,mc,iptr;>)
    dev←getdev(file,if bigmsk then "DAT" else "RED");
    indmp(dev,file,picbuf←fndbuf,flag←0);
    rowlim←rows(picbuf);
    collim←colms(picbuf);
    regmax←length(regs1)-1;
    byts←0;
    do byts←byts+1 until (2↑byts)>(regmax+1);
    getbuf(rowlim,collim,byts,regbuf←fndbuf);
    putsub(isubst(picbuf),jsubst(picbuf),regbuf);
    frebuf(picbuf);
ifcr false thenc
    for i←1 thru regmax do
	begin
	reg←dregfnd(i,regs1,flag);
	if dmask⊗reg≡BIND maskn
	  ∧ (ddescendants⊗reg =NIL)
	    then begin
		outstr("Border for: "&datum(reg)&crlf);
		dev←getdev(masks←datum(maskn),if bigmsk then "BIG" else "MSK");
		indmp(dev,masks,picbuf←fndbuf,flag←-2);
		if flag then continue;
		mr←rows(picbuf);
		mc←colms(picbuf);
		uptoval(ii←1,jj←1,1,picbuf);
		border(ii,jj,picbuf,regbuf,0,0,0,0,-i);
		frebuf(picbuf);
		end;
	end;
endc

    begintim(Get Neighbors,
    <safe integer array neiarr[0:2↑bytsz(regbuf)];>)
    for i←1 thru regmax do
	begin "finlop"
	reg←dregfnd(i,regs1,flag);
	if dmask⊗reg≡BIND maskn
	  ∧ (ddescendants⊗reg =NIL)
	    then begin "callop"
		outstr("Neighbors for: "&datum(reg)&crlf);
		dev←getdev(masks←datum(maskn),if bigmsk then "BIG" else "MSK");
		indmp(dev,masks,picbuf←fndbuf,flag←-2);
		if flag then continue;
		mr←rows(picbuf);
		mc←colms(picbuf);
		uptoval(ii←1,jj←1,1,picbuf);
		arrclr(neiarr);
		neifnd(ii,jj,picbuf,regbuf,i,neiarr);
		frebuf(picbuf);
		for ii←1 thru i-1 do
		    if neiarr[ii]
			then begin
			    dadd(dneighbor,reg,dregfnd(ii,regs1,flag));
			    dadd(dneighbor,dregfnd(ii,regs1,flag),reg);
			    end;
		end;
	end;
    endtim(Get Neighbors);
    frebuf(regbuf);
    endtim(neighb);
end "neighb";